// 模型文件，存放着模型的模板

const draw = require("./draw");

/**
 * 定义学生对象
 * @param id 编号 需要文字显示
 * @param health   学生的健康状态
 * @param isMask   是否有口罩
 * @param isVirus 是否有病毒
 * @param result 核算的结果
 * @param isStop 是否停止 在建筑内
 * @param position StudentPosition  学生的位置
 * @param initSpeedX 初始速度 X轴的速度
 * @param initSpeedY 初始速度 Y轴的速度
 * @constructor()
 */
function Student(id,health,isMask,isVirus,result,isStop,position,initSpeedX,initSpeedY){
    // 存活时间
    this.day = 0;
    this.hour = 0;
    // 做核酸
    this.makeNucleicAcid = {
        whetherNucleicAcid: false,  // 学生是否做了核酸, 默认为  false 未做核酸
        // 核酸结果，在学生做了核酸，并达到核酸结果发放的时间，将结果发放，赋值给Student.result
        result: ''
    }
    // id编号
    this.id = id;
    // 患病率
    this.prevalence = 0;
    // 健康
    this.health = health;
    // 是否带口罩
    this.isMask = isMask;
    // 是否携带病毒
    this.isVirus = isVirus;
    // 核酸监测结果
    this.result = result;
    // 是否停留
    this.isStop = isStop;
    // 位置
    this.position = position;
    // 学生的移动速度
    this.speed = {
        x:initSpeedX,
        y:initSpeedY
    }
}
/**
 * 学生的坐标及其要显示的信息
 * @param x 起始坐标x
 * @param y 起始坐标y
 * @param r 半径
 * @param lineWidth 线宽
 * @param lienColor 线的颜色 与是否带口罩有关
 * @param fillColor 填充颜色 与学生的健康有关
 * @param textColor 显示文字的颜色， 与学生的核算监测结果相关
 * @constructor()
 */
function StudentPosition(x,y,r,lineWidth,lienColor,fillColor,textColor){
    this.x = x;
    this.y = y;
    this.r = r;
    this.lineWidth = lineWidth;
    this.lienColor = lienColor;
    this.fillColor = fillColor;
    this.textColor = textColor;
}
/**
 * 建筑的位置极其显示的信息
 * @param centerX 建筑中心坐标x
 * @param centerY 建组中心坐标y
 * @param w 宽度
 * @param h 高度
 * @param lineWidth 线宽
 * @param color 线的颜色
 * @constructor
 */
function BuildingPosition(centerX,centerY,w,h,lineWidth,color){
    this.centerX = centerX;
    this.centerY = centerY;
    // 开始绘制的坐标
    this.beginX = centerX - w/2;
    this.beginY = centerY - h/2;
    // 绘制的宽、高
    this.w = w;
    this.h = h;
    // 矩形的宽度
    this.lineWidth = lineWidth;
    // 矩形的边框的颜色
    this.color = color;
}
/**
 * 定义建筑对象
 * @param name 建组名
 * @param isItContagious 是否传染
 * @param position BuildingPosition 建筑的位置
 * @constructor
 */
function Building(name,isItContagious,position){
    this.name = name;
    this.isItContagious = isItContagious;
    this.position = position;
}
/**
 * 帧对象，表示一帧要渲染的内容 构建对象时，将一些不会改变的值传入，学生对象，由setStudent()方法设置
 * @param context 画笔对象
 * @param initData index.js里面的数据对象共享到model.Frame对象中
 * @param width 一帧画像的宽度
 * @param height 一帧画像的高度
 * @constructor
 */
function Frame(context,initData,width,height){
    this.context = context;
    this.width = width;
    this.height = height;
    this.initData = initData;
    this.render = function(){
        // TODO 将模型中的数据和要显示的图像数据进行解耦
        // 目的是 分开模型中的数据操作和要显示的图像数据操作
        // 清除画布
        context.clearRect(0, 0, this.width, this.height);
        context.fillStyle = this.initData.background;
        context.fillRect(0, 0, this.width, this.height);
        // 显示时间
        showTime(this.context,this.initData.day,this.initData.hour);
        // 显示一帧的建筑
        initData.buildingList.forEach(building=>{
            draw.showBuildingInfo(this.context,building);
        })
        // 显示一帧的学生
        // console.log(this.initData);
        initData.students.forEach(student=>{
            draw.showStudentInfo(this.context,student);
        })
    }
}


function showTime(context,day,hour) {
    draw.drawText(context, `time : ${day} 天 : ${hour} 时`, 40, 44, '10px 宋体', 'red');
}
// 导出模块
export {Student,StudentPosition,BuildingPosition,Building,Frame}
